草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - STL 容器是否设计为允许继承?

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:IsitokaytoinheritimplementationfromSTLcontainers,ratherthandelegate?我的问题与Whydon'tSTLcontainershavevirtualdestructors?有关有些人(包括前一个问题的作者)确信没有虚拟dtor意味着类不可继承。我对如此强烈的声明持怀疑态度,因此我询问了来源或一些推理,但大多数受访者保持沉默。也没有人回复我的answer所以我认为质疑前一个问题中的假设并澄清这个重要问题是个好主意。STL容器是否设计为允许继承?更一般地

c++ - 是否有可能在任何地方引发异常的 STL 容器方法列表?

我知道STL会抛出内存分配错误,或者如果包含的类型在其构造函数/赋值运算符中抛出。否则,显然“一些”STL方法可能会引发其他异常。每个人似乎都提到的例子是vector::at(),但我在任何地方都找不到其他人的列表。有人知道这样的list吗? 最佳答案 不会100%准确,并且适​​用于C++03,但基于通过GCC4.3.4grepping的半小时工作包括,忽略tr1和ext但包括iostream。至关重要的是,其中一些检查可能是由于此实现更喜欢更具防御性的编码,并且可能未在标准中强制要求并且普遍可用....位集std::overfl

c++ - 是否有可能在任何地方引发异常的 STL 容器方法列表?

我知道STL会抛出内存分配错误,或者如果包含的类型在其构造函数/赋值运算符中抛出。否则,显然“一些”STL方法可能会引发其他异常。每个人似乎都提到的例子是vector::at(),但我在任何地方都找不到其他人的列表。有人知道这样的list吗? 最佳答案 不会100%准确,并且适​​用于C++03,但基于通过GCC4.3.4grepping的半小时工作包括,忽略tr1和ext但包括iostream。至关重要的是,其中一些检查可能是由于此实现更喜欢更具防御性的编码,并且可能未在标准中强制要求并且普遍可用....位集std::overfl

c++ - STL映射查找线程安全

STLmap线程上的find调用安全吗? 最佳答案 不,C++规范不保证任何STL容器上操作的规范中的线程安全。如果线程安全很重要,您应该提供自己的锁定。话虽如此,不同的实现似乎提供了不同的保证。例如,大多数似乎允许多个并发读取器,只要没有同时执行写入。如果您不关心可移植性,则可以研究实现文档。例如来自here对于SGISTL:TheSGIimplementationofSTListhread-safeonlyinthesensethatsimultaneousaccessestodistinctcontainersaresafe,

c++ - STL映射查找线程安全

STLmap线程上的find调用安全吗? 最佳答案 不,C++规范不保证任何STL容器上操作的规范中的线程安全。如果线程安全很重要,您应该提供自己的锁定。话虽如此,不同的实现似乎提供了不同的保证。例如,大多数似乎允许多个并发读取器,只要没有同时执行写入。如果您不关心可移植性,则可以研究实现文档。例如来自here对于SGISTL:TheSGIimplementationofSTListhread-safeonlyinthesensethatsimultaneousaccessestodistinctcontainersaresafe,

c++ - 用 C++ 编写我自己的类似 STL 的迭代器的实现

我目前正在尝试了解各种语言中迭代器的内在特性,即它们的实现方式。比如下面这个类暴露了list接口(interface)。templateclassList{public:virtualvoidInsert(intbeforeIndex,constTitem)throw(ListException)=0;virtualvoidAppend(constTitem)=0;virtualTGet(intposition)constthrow(ListException)=0;virtualintGetLength()const=0;virtualvoidRemove(intposition)t

c++ - 用 C++ 编写我自己的类似 STL 的迭代器的实现

我目前正在尝试了解各种语言中迭代器的内在特性,即它们的实现方式。比如下面这个类暴露了list接口(interface)。templateclassList{public:virtualvoidInsert(intbeforeIndex,constTitem)throw(ListException)=0;virtualvoidAppend(constTitem)=0;virtualTGet(intposition)constthrow(ListException)=0;virtualintGetLength()const=0;virtualvoidRemove(intposition)t

c++ - STL vector 和线程安全

假设我有一个包含N个元素的vector,但该vector的最多n个元素具有有意义的数据。一个更新线程更新第n个或第n+1个元素(然后设置n=n+1),还检查n是否太接近N并在必要时调用vector::resize(N+M)。更新后,线程调用多个子线程最多读取第n个数据并进行一些计算。保证子线程永远不会更改或删除数据,(实际上没有任何数据被删除)并且更新程序在完成更新后立即调用子线程。目前还没有出现问题,但是我想问一下,在将vector重新分配到更大的内存块时是否会出现问题,如果上次更新还剩下一些子工作线程。或者在这种多线程情况下使用vector是否安全,因为它不是线程安全的?编辑:由于

c++ - STL vector 和线程安全

假设我有一个包含N个元素的vector,但该vector的最多n个元素具有有意义的数据。一个更新线程更新第n个或第n+1个元素(然后设置n=n+1),还检查n是否太接近N并在必要时调用vector::resize(N+M)。更新后,线程调用多个子线程最多读取第n个数据并进行一些计算。保证子线程永远不会更改或删除数据,(实际上没有任何数据被删除)并且更新程序在完成更新后立即调用子线程。目前还没有出现问题,但是我想问一下,在将vector重新分配到更大的内存块时是否会出现问题,如果上次更新还剩下一些子工作线程。或者在这种多线程情况下使用vector是否安全,因为它不是线程安全的?编辑:由于

STL容器之queue

是什么循环队列,FIFO先进先出怎么用初始化//C11dequedeq{1,2,3,4,5};//拷贝构造,可以拷贝dequequeueque(deq);//100个5queueque2(100,5);//运算符重载que2=que;操作//队尾添加元素(这里只有一个出入口,就无所谓前后了也不用什么push_back())que.push(1);//弹出队首的元素que.pop();//在队尾构造并插入新元素que.emplace("2");查看状态类ps:stack和queue都是deque的特殊情况,他们不提供迭代器操作,自然地,不支持[]访问//返回bool类型,如果为空,返回1,否则返